package avicit.cbb.techclass.tabledefine.commtempletmanager.action.service;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.List;
import java.util.Map;
import java.util.Vector;

import avicit.cbb.techclass.appreg.domain.CbbSysInfo;
import avicit.cbb.techclass.tabledefine.commtempletmanager.domain.CbbTempletCode;
import avicit.cbb.techclass.tabledefine.commtempletmanager.domain.CbbTempletField;
import avicit.cbb.techclass.tabledefine.commtempletmanager.domain.CbbTempletInfo;
import avicit.platform6.commons.utils.web.TreeNode;
import avicit.platform6.core.dao.Paging;
import avicit.platform6.core.domain.BeanBase;
import avicit.platform6.core.jdbc.Page;

/**
 * 参考模版实现类接口 创建时间：2014-08-19
 *
 * @author 朱锋
 *
 */
public interface CommTempletManagerService {
	/**
	 * 获取参考模板基本信息--（表格用的带分页）
	 *
	 * @param page
	 * @param parameter
	 * @return
	 */
	public Paging<CbbTempletInfo> getPageList(Paging<CbbTempletInfo> page,
			Map<String, Object> parameter, String sysId) throws Exception;

	/**
	 * 根据参考模板基本信息ID获取该对象
	 *
	 * @param id
	 * @return
	 */
	public CbbTempletInfo getCommTempletInfoById(String id) throws Exception;

	/**
	 * 根据参考模板字段信息ID获取该对象
	 *
	 * @param id
	 * @return
	 */
	public CbbTempletField getCommTempletFieldById(String id) throws Exception;

	/**
	 * 根据组织ID获取列名
	 *
	 * @param templetId,orgId,templetModelType
	 * @return
	 */
	public List<Map<String, Object>> getCommTempletFieldByTempletId(String orgId, String templetModelType, String templetId);

	/**
	 * 参考模板基本信息名称唯一性验证
	 *
	 * @param id
	 * @param name
	 * @return
	 */
	public boolean checkUnique(String name, String id, String sysId) throws Exception;

	/***
	 * 参考模板字段信息中文名称唯一性验证
	 *
	 * @author 郭亮
	 * @param label
	 * @param tId
	 * @param id
	 * @param sysId
	 * @return boolean
	 * @throws
	 */
	public boolean checkFieldLabelUnique(String label, String tId, String id,
			String sysId);

	/**
	 * 更新参考模板基本信息
	 *
	 * @param bean
	 * @throws DaoException
	 */
	public void updateCommTempletInfo(CbbTempletInfo commTempletInfo)
			throws Exception;

	/**
	 * 新增参考模板基本信息
	 *
	 * @param commTempletInfo
	 */
	public void insertCommTempletInfo(CbbTempletInfo commTempletInfo,
			String orgId, String deptId) throws Exception;

	/**
	 * 删除参考模板基本信息
	 *
	 * @param ids
	 * @throws DaoException
	 */
	public void deleteCommTempletInfoById(String ids, String sysId)
			throws Exception;

	/**
	 * 根据参考模板字段信息ID删除该数据
	 *
	 * @param id
	 * @throws DaoException
	 */
	public void deletecommTempletFieldById(String id, String sysId)
			throws Exception;

	/**
	 * 获取参考模板字段数据信息
	 *
	 * @param page
	 * @param parameter
	 * @return
	 */
	public Paging<CbbTempletField> getPageDetailList(
			Paging<CbbTempletField> page, Map<String, Object> parameter,
			String sysId);

	/**
	 * 参考模板字段信息名称唯一性验证
	 *
	 * @param name
	 * @param tId
	 * @param id
	 * @return
	 */
	public boolean checkFieldUnique(String name, String tId, String id,
			String sysId) throws Exception;

	/**
	 * 参考模板字段信息更新操作
	 *
	 * @param bean
	 * @throws DaoException
	 */
	public void updateDetailCommTempletField(BeanBase bean, String sysId)
			throws Exception;

	/***
	 * 参考模板字段信息更新操作
	 *
	 * @param cbbTempletFields
	 * @param sysId
	 * @throws Exception
	 */
	public void updateDetailCommTempletFields(
			CbbTempletField[] cbbTempletFields, String sysId) throws Exception;

	/**
	 * 参考模板字段信息新增操作
	 *
	 * @param commTempletField
	 * @throws DaoException
	 */
	public void insertCommTempletField(CbbTempletField commTempletField,
			String sysId, String orgId, String deptId) throws Exception;

	/**
	 * 参考模板字段信息新增操作
	 *
	 * @param commTempletField
	 * @throws DaoException
	 */
	public void insertCommTempletFields(CbbTempletField[] commTempletFields,
			String sysId, String orgId, String deptId, String templetId)
			throws Exception;

	/**
	 * 初始化字段维护 参考模板字段信息新增操作
	 *
	 * @param commTempletField
	 * @throws DaoException
	 */
	public void insertCommTempletInitFields(
			CbbTempletField[] commTempletFields, String sysId, String orgId,
			String deptId, String templetId) throws Exception;

	/**
	 * 删除参考模板字段信息操作
	 *
	 * @param ids
	 */
	public void deleteCommTempletField(String ids, String sysId)
			throws Exception;

	/**
	 * 获取分类树节点
	 *
	 * @param id
	 * @return
	 */
	public List<TreeNode> getCommTempletInfoTreeNodes(String id, String sysId, String orgId) throws Exception;

	/**
	 * 获取分类树节点
	 *
	 * @param id
	 * @return
	 */
	public List<TreeNode> getCommTempletInfoTreeNodesRoot(String id, String sysId, String orgId) throws Exception;

	/**
	 * 获取系统标识信息
	 *
	 * @return
	 */
	public List<CbbSysInfo> getCommSysInfo(String orgId) throws Exception;

	/**
	 * 根据ID获取系统标识信息
	 *
	 * @param id
	 * @return
	 */
	public CbbSysInfo getCommSysInfoById(String id);

	/**
	 * 获取参考模板代码维护信息
	 *
	 * @param page
	 * @param parameter
	 * @return
	 */
	public Page<Map<String, Object>> getPageCodeDetailList(
			Paging<CbbTempletCode> page, Map<String, Object> parameter,
			String sysId) throws Exception;

	/**
	 * 验证手写通用代码显示值，真实值唯一性
	 *
	 * @param lookupName
	 * @param lookupCode
	 * @param id
	 * @param tid
	 * @param fid
	 * @return
	 */
	public int checkCodeUnique(String lookupName, String lookupCode, String id,
			String tid, String fid, String sysId) throws Exception;

	/**
	 * 手写通用代码更新操作
	 *
	 * @param bean
	 * @throws DaoException
	 */
	public void updateDetailCommTempletCode(BeanBase bean, String sysId)
			throws Exception;

	/**
	 * 根据参考模板代码维护ID查询参考模板代码维护数据
	 *
	 * @param id
	 * @return
	 */
	public CbbTempletCode getCommTempletCodeById(String id);

	/**
	 * 参考模板代码维护新增操作
	 *
	 * @param commTempletCode
	 * @throws DaoException
	 */
	public void insertCommTempletCode(CbbTempletCode commTempletCode,
			String sysId, String orgId, String deptId) throws Exception;

	/**
	 * 根据参考模板代码维护删除该数据
	 * @author 朱锋
	 * @param id
	 * @param sysId
	 * @throws Exception void
	 * @throws
	 */
	public void deletecommTempletCodeById(String id, String sysId)
			throws Exception;

	/**
	 * 获取平台通用代码信息
	 *
	 * @param page
	 * @param parameter
	 * @return
	 */
	public Page<Map<String, Object>> getPageSysCodeDetailList(
			Paging<CbbTempletCode> page, Map<String, Object> parameter,
			String sysId) throws Exception;

	/**
	 * 获取平台通用代码子信息
	 *
	 * @param page
	 * @param parameter
	 * @return
	 */
	public Page<Map<String, Object>> getPageSysCodeSonList(
			Paging<CbbTempletCode> page, Map<String, Object> parameter,
			String sysId) throws Exception;

	/**
	 * 新增系统通用代码信息
	 *
	 * @param cid
	 * @param fid
	 * @throws DaoException
	 * @return
	 */
	public void insertSysCode(String cid, String tid, String fid, String sysId,
			String orgId, String deptId) throws Exception;

	/**
	 * 删除系统通用代码
	 *
	 * @param cid
	 * @param fid
	 * @throws DaoException
	 * @return
	 */
	public void deleteSysCode(String tid, String fid, String sysId);

	/**
	 * 获取生成方式
	 *
	 * @author 朱锋
	 * @param page
	 * @param parameter
	 * @return Page<Map<String,Object>>
	 * @throws
	 */
	public Page<Map<String, Object>> getPageRuleDetailList(
			Paging<CbbTempletCode> page, Map<String, Object> parameter) throws Exception;

	/**
	 * 根据参考模版CODE获取参考模版ID
	 *
	 * @author 朱锋
	 * @param code
	 * @param sysId
	 * @return
	 * @throws Exception
	 *             String
	 * @throws
	 */
	public String getTempltIdByTempltCode(String code, String sysId)
			throws Exception;

	/***
	 * 查询最大排序数
	 *
	 * @param id
	 * @param sysId
	 * @return
	 */
	public int getMaxOrderNum(String id, String sysId) throws Exception;

	/***
	 * 导出结构模板
	 *
	 * @param headValue
	 * @param out
	 * @throws Exception
	 */
	public void exportExcelModule(List<String> headValue,
			ByteArrayOutputStream out) throws Exception;

	/***
	 * 获取导出数据
	 *
	 * @param templetId
	 * @return
	 * @throws Exception
	 */
	public List<Map<String, Object>> getCbbTempletFields(String templetId,String orgId)
			throws Exception;

	/**
	 * 导出结构数据
	 *
	 * @param headValue
	 * @param head
	 * @param data
	 * @param out
	 * @throws Exception
	 * @throws
	 */
	public void exportData(List<String> headValue, List<String> head,
			List<Map<String, Object>> data, ByteArrayOutputStream out)
			throws Exception;

	/**
	 * 构造导出文件名
	 *
	 * @author 朱锋
	 * @param tableId
	 * @return String
	 * @throws
	 */
	public String getFileName(String id) throws Exception;

	/***
	 * 解析 excel2003 文件
	 *
	 * @param fileName
	 * @return
	 * @throws IOException
	 */
	public Map<String, Vector<Vector<String>>> readXls(String fileName)
			throws IOException;

	/***
	 * 解析 excel2007 文件
	 *
	 * @param fileName
	 * @return
	 * @throws Exception
	 */
	public Map<String, Vector<Vector<String>>> readXlsx(String fileName)
			throws Exception;

	/***
	 * 判断excel文件数据合法性
	 *
	 * @param datas
	 * @param columnId
	 * @throws Exception
	 */
	public void testExcel(Vector<Vector<String>> datas, String templetId)
			throws Exception;

	/***
	 * 将excel中的数据添加到数据库中
	 *
	 * @param datas
	 * @param sysId
	 * @param nodeId
	 * @param nodeName
	 * @param tableName
	 * @param orgId
	 * @param deptId
	 * @param loginUserId
	 * @param loginIp
	 * @throws Exception
	 */
	public void insertFromExcel(Vector<Vector<String>> datas, String sysId,
			String orgId, String deptId, String templetId) throws Exception;

	/***
	 * 初始化字段维护导入判断excel文件数据合法性
	 *
	 * @param datas
	 * @param columnId
	 * @throws Exception
	 */
	public void initFieldTestExcel(Vector<Vector<String>> datas,
			String templetId) throws Exception;

	/***
	 * 初始化字段维护导入将excel中的数据添加到数据库中
	 *
	 * @param datas
	 * @param sysId
	 * @param nodeId
	 * @param nodeName
	 * @param tableName
	 * @param orgId
	 * @param deptId
	 * @param loginUserId
	 * @param loginIp
	 * @throws Exception
	 */
	public void initFieldInsertFromExcel(Vector<Vector<String>> datas,
			String sysId, String orgId, String deptId, String templetId)
			throws Exception;

	/**
	 * 参考模板初始化字段新增方法
	 *
	 * @author 朱锋
	 * @param commTempletFields
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param templetId
	 * @param treeId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	public void insertCbbTempletFieldArray(CbbTempletField[] cbbTempletFields,
			String sysId, String orgId, String deptId, String templetId)
			throws Exception;

	/**
	 * 参考模板初始化字段更新方法
	 *
	 * @author 朱锋
	 * @param cbbTempletFields
	 * @param templetId
	 * @param sysId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	public void updateCbbTempletFieldArray(CbbTempletField[] cbbTempletFields,
			String templetId, String sysId) throws Exception;

	/**
	 * 参考模板初始化字段通用代码新增方法
	 *
	 * @author 朱锋
	 * @param CbbTempletCodes
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param templetId
	 * @param fieldId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	public void insertCbbTempletFieldCodeArray(String inserCodeData,
			String sysId, String orgId, String deptId, String templetId,
			String fieldId) throws Exception;

	/**
	 * 参考模板初始化字段通用代码更新方法
	 *
	 * @author 朱锋
	 * @param CbbTempletCodes
	 * @param templetId
	 * @param fieldId
	 * @param sysId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	public void updateCbbTempletFieldCodeArray(String updateCodeData,
			String templetId, String fieldId, String sysId) throws Exception;

	/**
	 * 参考模板初始化字段通用代码删除方法
	 *
	 * @author 朱锋
	 * @param deleteData
	 * @param templetId
	 * @param fieldId
	 * @param sysId
	 * @throws Exception
	 *             void
	 * @throws
	 */
	public void deletecommTempletCodeBydeleteData(String deleteData,
			String templetId, String fieldId, String sysId) throws Exception;

	/**
	 * 判断是否存在根节点
	 * @param deptId
	 * @return int
	 * @throws
	 */
	public int getParentNodeByParentId(String deptId) throws Exception;

	/**
	 * 构建参考模板根节点
	 * @param deptId
	 * @return
	 * @throws Exception CbbTempletInfo
	 * @throws
	 */
	public CbbTempletInfo saveRootLantopArchiveTabClassVByType(String deptId) throws Exception;

	/**
	 * 判断是否存在系统初始化字段
	 * @param tid
	 * @return
	 * @throws Exception boolean
	 * @throws
	 */
	public boolean getExistfieldBytid(String tid) throws Exception;


	/**
	 * @author youyu
	 * 获得根节点下，指定系统、模板对应的所有字段信息
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param sysNodeId
	 * @param tempModelType
	 * @return List<Map<String, Object>>
	 * */
	public List<Map<String, Object>> getSysNodeFileds(String sysId, String orgId, String deptId,
			String sysNodeId, String tempModelType);

	/**
	 * @author youyu
	 *  验证给定的字段信息是否存在与初始化字段及根组织对应系统节点、模板类型字段中
	 * @param sysId
	 * @param orgId
	 * @param deptId
	 * @param sysNodeId
	 * @param tempModelType
	 * @param nodeRows
	 * @param treeType
	 * @return String
	 * */
	public String duplicateCheck(String sysId, String orgId, String deptId,
			String sysNodeId, String tempModelType, String nodeRows,String treeType) throws Exception;

	/**
	 * @author youyu
	 * 根据参考模板类型信息获得当前组织的参考模板信息和根组织的参考模板信息
	 * @param sysId
	 * @param orgId
	 * @param tempModelType
	 * @return
	 */
	public List<Map<String, Object>> getCommTempletByTempModelType(String sysId, String orgId, String tempModelType);

}